// utils/mockUtils.js

// 引入本地的 mockData.js 文件
const mockData = require('./mockData.js'); 
const MOCK_BASE_URL = 'https://api.learnpath.com';

/**
 * 模拟 wx.request 的函数
 * @param {Object} options - wx.request 的参数对象
 */
function mockRequest(options) {
  const { url, success, fail, complete } = options;
  
  console.log(`%c[MOCK] 拦截请求: ${url}`, 'color: #33aaff;');
  
  // 1. 提取请求路径，并去除 API 基地址
  let path = url.replace(MOCK_BASE_URL, '').trim();
  
  // 2. 移除路径中的查询参数 (如 ?pathID=xxx)
  const queryParams = {};
  if (path.includes('?')) {
    const parts = path.split('?');
    path = parts[0];
    // 解析查询参数
    if (parts[1]) {
      parts[1].split('&').forEach(param => {
        const [key, value] = param.split('=');
        if (key && value) {
          queryParams[decodeURIComponent(key)] = decodeURIComponent(value);
        }
      });
    }
  }

  // 3. 移除路径开头和结尾的斜杠
  if (path.startsWith('/')) {
    path = path.substring(1);
  }
  if (path.endsWith('/')) {
    path = path.substring(0, path.length - 1);
  }
  
  // 4. 将路径中的斜杠 '/' 替换为点号 '.'，以匹配 mockData.js 中的键名
  const mockKey = path.replace(/\//g, '.');

  console.log(`%c[MOCK] 处理后的路径: ${path}`, 'color: #33aaff;');
  console.log(`%c[MOCK] 尝试匹配键名: ${mockKey}`, 'color: #33aaff;');
  console.log(`%c[MOCK] 查询参数:`, 'color: #33aaff;', queryParams);

  let data = mockData[mockKey];

  // 特殊处理：如果请求的是 expertPath/detail，返回 expert_path 数据
  if (mockKey === 'expertPath.detail' && !data) {
    console.log('%c[MOCK] 尝试匹配 expert_path 数据', 'color: #ffaa00;');
    data = mockData['conversation.expert_path'];
  }

  // 特殊处理：如果请求的是 expertPath/messages，返回 message 数据
  if (mockKey === 'expertPath.messages' && !data) {
    console.log('%c[MOCK] 尝试匹配 conversation.message 数据', 'color: #ffaa00;');
    data = mockData['conversation.message'];
  }

  // 特殊处理：如果请求的是 conversation/add_message，返回单个 message 数据
  if (mockKey === 'conversation.add_message' && !data) {
    console.log('%c[MOCK] 处理 conversation.add_message 请求', 'color: #ffaa00;');
    // 从 conversation.message 中随机返回一条数据
    const messages = mockData['conversation.message'] || [];
    if (messages.length > 0) {
      const randomIndex = Math.floor(Math.random() * messages.length);
      data = [messages[randomIndex]]; // 返回数组格式
    }
  }

  // 特殊处理：如果请求的是 expertPath/add_message，返回单个 message 数据
  if (mockKey === 'expertPath.add_message' && !data) {
    console.log('%c[MOCK] 处理 expertPath.add_message 请求', 'color: #ffaa00;');
    // 从 conversation.message 中随机返回一条数据
    const messages = mockData['conversation.message'] || [];
    if (messages.length > 0) {
      const randomIndex = Math.floor(Math.random() * messages.length);
      data = [messages[randomIndex]]; // 返回数组格式
    }
  }

  // 特殊处理：如果请求的是 expertPath/record_test_result，返回成功响应
  if (mockKey === 'expertPath.record_test_result' && !data) {
    console.log('%c[MOCK] 处理 expertPath.record_test_result 请求', 'color: #ffaa00;');
    data = {
      success: true,
      message: '测试结果记录成功'
    };
  }

  if (data) {
    console.log('%c[MOCK] 数据匹配成功，返回 mock 数据。', 'color: #00aa00;');
    
    // 构建响应数据
    let responseData = data;
    
    // 对于 detail 请求，包装成 success 格式
    if (mockKey === 'expertPath.detail') {
      if (Array.isArray(data) && data.length > 0) {
        responseData = {
          success: true,
          ...data[0] // 取第一个专家路径
        };
      } else {
        responseData = {
          success: true,
          goal: '小学数学',
          subject: '数学',
          path: ['数的认识', '自然数', '数的比较', '加法', '减法'],
          masteryStatus: {}
        };
      }
    }
    
    // 对于 messages 请求，包装成 success 格式
    if (mockKey === 'expertPath.messages') {
      responseData = {
        success: true,
        messages: Array.isArray(data) ? data : [data]
      };
    }

    const mockResponse = {
      data: responseData,
      statusCode: 200,
      header: {},
      errMsg: 'request:ok'
    };
    
    console.log('%c[MOCK] 返回数据:', 'color: #00aa00;', mockResponse.data);
    
    // 使用 setTimeout 模拟网络延迟
    setTimeout(() => {
      success && success(mockResponse);
      complete && complete(mockResponse);
    }, 300);
    
  } else {
    console.error(`%c[MOCK ERROR] 未找到匹配的 mock 数据键名: ${mockKey}.`, 'color: #ff0000;');
    console.log('%c[MOCK] 可用的键名:', 'color: #ff0000;', Object.keys(mockData));
    
    const errorResponse = {
      data: {
        success: false,
        detail: `Mock key '${mockKey}' not found in mockData.js`
      },
      statusCode: 404,
      errMsg: 'request:fail mock not found'
    };
    
    setTimeout(() => {
      fail && fail(errorResponse);
      complete && complete(errorResponse);
    }, 300);
  }
}

module.exports = {
  mockRequest,
  MOCK_BASE_URL,
};